﻿// Inner Fire 游戏引擎库
// ConfigManager - 配置管理器
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：框架层(5)
// 和Assets一样，通过Xml载入的配置文件。和Assets分管不同的资源。
// Assets管理的是需要后载入的东西，比如贴图，模型。这些不可能都在游戏开始载入。
// 但ConfigManager则是载入一切需要的配置。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-07-05

#include "config_manager.h"
#include "ref_info.h"
#include <stop_watch.h>

using namespace ikit;

namespace ifire::game {
// 用于单例模式
ConfigManager* ConfigManager::instance_ = nullptr;

ConfigManager::ConfigManager(GameManager* gm, const ikit::XmlNode& root)
    : gm_(gm) {
  instance_ = this;
  // ------
  // 载入XML信息
  // ------
  LoadMapSettings(root("MapSettings"));
  LoadPhysicsBoneSettings(root("PhysicsBoneSettings"));
  LoadAvatarGroups(root("AvatarGroups"));

  // 载入预置体
  root.ForeachPaths("Prefab", [this](const char* f) { LoadPrefabs(f); });
  // 载入UI预置体
  root.ForeachPaths("UIPrefab", [this](const char* f) { LoadUIPrefabs(f); });
  // 载入通用骨架
  root.ForeachPaths("Avatar", [this](const char* f) { LoadAvatars(f); });
  // 载入角色动画
  root.ForeachPaths(
      "CharaAnimation", [this](const char* f) { LoadCharaAnimations(f); });
  // 载入角色攻击项目
  root.ForeachPaths("Attack", [this](const char* f) { LoadAttacks(f); });
  // 载入场景
  root.ForeachPaths("Scene", [this](const char* f) { LoadScenes(f); });
  // 载入碰撞体配置
  root.ForeachPaths(
      "ColliderSettings", [this](const char* f) { LoadColliders(f); });
  // 载入碰撞体Layer配置
  root.ForeachPaths(
      "LayerSettings", [this](const char* f) { LoadLayerSettings(f); });
  // 配置默认的层（必须在第一）
  default_layers_ = layers_.front().get();
}
ConfigManager::~ConfigManager() {}

void ConfigManager::Setup() {
  ConfigInfo::Setup(map_settings_);
  ConfigInfo::Setup(avatars_);
  ConfigInfo::Setup(chara_animations_);
  ConfigInfo::Setup(attacks_);
}

void ConfigManager::LoadAvatarGroups(const eastl::string_view& filename) {
  LoadFile(filename, "AvatarGroup", avatar_groups_);
  // 第一个必然是Humanoid
  humanoid_ = avatar_groups_[0].get();
}

void ConfigManager::LoadMapSettings(const eastl::string_view& filename) {
  LoadFile(filename, "MapSetting", map_settings_);
}

void ConfigManager::LoadPhysicsBoneSettings(
    const eastl::string_view& filename) {
  LoadFile(filename, "PhysicsBoneSetting", physics_settings_);
}

void ConfigManager::LoadPrefabs(const eastl::string_view& filename) {
  LoadFile(filename, "Prefab", prefabs_);
}

void ConfigManager::LoadUIPrefabs(const eastl::string_view& filename) {
  LoadFile(filename, "UIPrefab", ui_prefabs_);
}

void ConfigManager::LoadAvatars(const eastl::string_view& filename) {
  LoadFile(filename, "Avatar", avatars_);
}

void ConfigManager::LoadCharaAnimations(const eastl::string_view& filename) {
  LoadFile(filename, "CharaAnimation", chara_animations_);
}

void ConfigManager::LoadScenes(const eastl::string_view& filename) {
  LoadFile(filename, "Scene", scenes_);
}

void ConfigManager::LoadAttacks(const eastl::string_view& filename) {
  LoadFile(filename, "Attack", attacks_);
}

void ConfigManager::LoadColliders(const eastl::string_view& filename) {
  LoadFile(filename, "Collider", colliders_);
}

void ConfigManager::LoadLayerSettings(const eastl::string_view& filename) {
  LoadFile(filename, "LayerSetting", layers_);
}

MapSetting* ConfigManager::GetMapSetting(ikit::sstr name) { // 常规检查
  return ikit::get_item_by_name(map_settings_, name);
}

PhysicsBoneSetting* ConfigManager::GetPhysicsBoneSetting(ikit::sstr name) {
  return ikit::get_item_by_name(physics_settings_, name);
}

AvatarGroup* ConfigManager::GetAvatarGroup(ikit::sstr name) {
  return ikit::get_item_by_name(avatar_groups_, name, humanoid_);
}

Prefab* ConfigManager::GetPrefab(ikit::sstr name) {
  return ikit::get_item_by_name(prefabs_, name);
}

UIPrefab* ConfigManager::GetUIPrefab(ikit::sstr name) {
  return ikit::get_item_by_name(ui_prefabs_, name);
}

Avatar* ConfigManager::GetAvatar(ikit::sstr name) {
  return ikit::get_item_by_name(avatars_, name);
}

CharaAnimation* ConfigManager::GetCharaAnimation(ikit::sstr name) {
  return ikit::get_item_by_name(chara_animations_, name);
}

SceneInfo* ConfigManager::GetScene(ikit::sstr name) {
  return ikit::get_item_by_name(scenes_, name);
}

AttackInfo* ConfigManager::GetAttack(ikit::sstr name) {
  return ikit::get_item_by_name(attacks_, name);
}

ColliderInfo* ConfigManager::GetCollider(ikit::sstr name) {
  return ikit::get_item_by_name(colliders_, name);
}

LayerSetting* ConfigManager::GetLayerSetting(ikit::sstr name) {
  return ikit::get_item_by_name(layers_, name);
}

int ConfigManager::GetLayer(ikit::sstr name) {
  return instance_->GetDefaultLayers()->GetLayer(name);
}

uint64_t ConfigManager::GetMask(ikit::sstr name) {
  return instance_->GetDefaultLayers()->GetMask(name);
}



} // namespace ifire::game